package com.geline.easyexcel.utils;

import java.lang.reflect.Field;
import java.util.*;

/**
 * 设置Entity属性默认值
 *
 * @author: mengxin
 * @date: 2024/1/26 17:35
 */
public class BeanFieldUtil {

    /**
     * 为指定实体类的所有字段以及多层子实体类的字段、各种集合类型的字段赋默认值
     * @param entity
     * @param allField  是否给所有属性设置默认值 true是,false只给null属性设置默认值
     * @param <T>
     * @return
     * @throws IllegalAccessException
     */
    public static <T> T setDefaultValues(T entity, boolean allField) throws IllegalAccessException {
        // 获取实体类的所有字段
        Field[] fields = entity.getClass().getDeclaredFields();
        // 遍历所有字段并为其赋默认值
        for(Field field : fields){
            if(field.getName().equals("serialVersionUID")){
                continue;
            }
            field.setAccessible(true);
            Object value = field.get(entity);
            if(!allField && value!=null){
                //不为null时才设置默认值
                continue;
            }
            Class<?> fieldType = field.getType();
            // 如果该字段是一个集合类型
            if(Collection.class.isAssignableFrom(fieldType)){
                // 判断集合类型的具体实现类
                if(List.class.isAssignableFrom(fieldType)){
                    // 创建一个空的List对象
                    value = new ArrayList<>();
                }else if(Set.class.isAssignableFrom(fieldType)){
                    // 创建一个空的HashSet对象
                    value = new HashSet<>();
                }else if(Map.class.isAssignableFrom(fieldType)){
                    // 创建一个空的HashMap对象
                    value = new HashMap<>();
                }else{
                    // 其他类型的集合使用空的Collection对象
                    value = new ArrayList<>();
                }
                field.set(entity, value);
            }
            // 如果该字段是一个实体类
            else if(fieldType.getClassLoader() != null){
                // 使用递归方式为子实体类的字段赋默认值
                Object subEntity = setDefaultValues(fieldType, allField);
                field.set(entity, subEntity);
            }else{
                // 如果该字段是一个基本类型或引用类型
                value = getDefaultFieldValue(fieldType);
                field.set(entity, value);
            }
        }
        return entity;
    }

    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    private static Object getDefaultFieldValue(Class<?> type) {
        if(type == int.class || type == Integer.class){
            return 0;
        }else if(type == long.class || type == Long.class){
            return 0L;
        }else if(type == float.class || type == Float.class){
            return 0.0F;
        }else if(type == double.class || type == Double.class){
            return 0.0D;
        }else if(type == byte.class || type == Byte.class){
            return (byte)0;
        }else if(type == short.class || type == Short.class){
            return (short)0;
        }else if(type == boolean.class || type == Boolean.class){
            return false;
        }else if(type == char.class || type == Character.class){
            return '\u0000';
        }else if(CharSequence.class.isAssignableFrom(type)){
            return "";
        }else{
            return null; // 引用类型默认为null
        }
    }

}
